package com.base.cn.platform.os.dao.user.user;

import com.base.cn.platform.os.common.mybatis.BaseDao;
import com.base.cn.platform.os.entity.statistics.base.ZStatisticsUserBaseCount;
import com.base.cn.platform.os.entity.statistics.users.UserCountEntity;
import com.base.cn.platform.os.entity.statistics.users.UserRegFromEntity;
import com.base.cn.platform.os.entity.user.count.UserRanking;
import com.base.cn.platform.os.entity.user.count.UserRegDayNum;
import com.base.cn.platform.os.entity.user.count.UserRegFromNum;
import com.base.cn.platform.os.entity.user.count.UserRegLayoutNum;
import com.base.cn.platform.os.entity.user.user.CusUser;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 用户Dao
 *
 * @author s.li
 * @create 2018-04-10-13:37
 */
@Mapper
public interface CusUserDao extends BaseDao<CusUser> {

    /**
     * 查询某一天平台用户24小时内每个小时的注册量
     * @param dateTime 查询的时间
     * @return
     */
    List<UserRegDayNum> queryUserRegDayTimeNum(@Param("clazz") Class<CusUser> clazz, @Param("dateTime") String dateTime);

    /**
     * 查询用户注册地理布局
     * @return 用户注册布局列表
     */
    List<UserRegLayoutNum> queryUserRegLayoutNum(@Param("clazz") Class<CusUser> clazz);

    /**
     * 查询注册对比数据统计数据
     * @return 统计数据对象
     */
    UserRegFromNum queryRegFromUserNum(@Param("clazz") Class<CusUser> clazz);

    /**
     * 查询平台用户某一时间段的注册量
     * @param clazz
     * @param param
     * @return
     */
    List<Map<String,Object>> queryUserDayTimeNum(@Param("clazz") Class<CusUser> clazz, @Param("param") Map<String,Object>  param);

    /**
     * 注册转化率
     * @return
     */

    String findRegisterConversionRate(@Param("clazz") Class<CusUser> clazz,@Param("param") Map param);

    /**
     * 购买转化率
     * @return
     */

    String findOrderConversionRate(@Param("clazz") Class<CusUser> clazz,@Param("param") Map param);
    /**
     * 日活跃DUA
     * @return
     */

    String findActiveDUA(@Param("clazz") Class<CusUser> clazz,@Param("param") Map param);

    /**
     *  7日转化
     * @return
     */

    String findSevenDayConversion(@Param("clazz") Class<CusUser> clazz);

    /**
     *  30日转化
     * @return
     */

    String findThirtyDayConversion(@Param("clazz") Class<CusUser> clazz);

    //===================================================================================

    /**
     * 查询用户每天的注册量
     * @param clazz
     * @param params
     * @return List<ZStatisticsUserBaseCount>
     */
    List<ZStatisticsUserBaseCount> queryUserDayRegCountList(@Param("clazz") Class<CusUser> clazz,
                                                            @Param("params") Map params);

    /**
     * 查询用户某天的注册量
     * @param clazz
     * @param queryTime
     * @return List<ZStatisticsUserBaseCount>
     */
    List<ZStatisticsUserBaseCount> queryUserOneDayRegCountList(@Param("clazz") Class<CusUser> clazz,
                                                               @Param("queryTime") String queryTime);

    /**
     * 查询指定时间内的注册用户量和用户总量（包含非注册的用户）
     * @param clazz
     * @param params
     * @return List<UserCountEntity>
     */
    List<UserCountEntity> queryNewUserAndUserSumList(@Param("clazz") Class<CusUser> clazz,
                                                      @Param("params") Map<String,Object> params);

    /**
     * 查询用户注册来源统计数据
     * @param clazz
     * @return UserRegFromEntity
     */
    UserRegFromEntity queryUserRegFormCountData(@Param("clazz") Class<CusUser> clazz);

    /**
     *  查询支付及未支付用户数据
     * @param clazz
     * @param timeSql 查询时间
     * @return Map<String,Integer>
     */
    Map<String, BigDecimal> queryUserPayCountData(@Param("clazz") Class<CusUser> clazz,
                                                  @Param("timeSql") String timeSql);

    List<UserRanking> queryUserRanking();
}
